linux 进阶(二)

作者 Claymore 日期 2017-03-09
linux 进阶(二)

计划任务crontab

我们会有写定期定时的任务。

该命令从输入设备读取指令,并将其放在crontab中,供之后读取和执行。

通常,crontab储存的指令被守护进程激活,crond为其守护进程,常常在后台执行,每一分钟会检查一次是否有预定的作业要执行。

  • 启动日志rsyslog

    启动日志来看我们的任务是否真的被执行

    sudo service rsyslog start

  • 启动crontab

    sudo cron -f &

  • 添加一个计划任务

    crontab -e

    第一次启动会让你选择一个编辑器,我们选择vim

  • 后续会进入到一个编辑界面,这边是添加计划的地方,与一般的配置文档相同,以#开头的是注释

    最后一句便是我们添加的任务了,这个任务每分钟会在home/claymore/创建一个年月日时分秒为名字的空白文件

    前面五颗星:minute hour day month week (美好日月星辰)

  • 查看添加了那些任务

    crontab -l

    虽然我们添加了任务,但是cron的守护进程没有启动不会检测到有任务,我们可以通过下面两种方式来确定我们的cron是否在后台启动:

    pa aux | grep cron

    pgrep cron

  • 看执行任务命令在日志的信息

    sudo tail -f /var/log/syslog

  • 删除任务

    crontab -r

深入

每次用crontab -e都会添加计划任务,都会在/var/spool/cron/crontabs中添加一个该用户自己的任务文档。这样是为了隔离

所以,系统级别的任务需要sudo权限编辑/etc/crontab文件就可以。

cron 服务监测时间最小单位是分钟,所以 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron/crontabs 里面的內容。

在 /etc 目录下,cron 相关的目录有下面几个:

每个目录的作用:

  1. /etc/cron.daily,目录下的脚本会每天执行一次,在每天的6点25分时运行;
  2. /etc/cron.hourly,目录下的脚本会每个小时执行一次,在每小时的17分钟时运行;
  3. /etc/cron.mouthly,目录下的脚本会每月执行一次,在每月1号的6点52分时运行;
  4. /etc/cron.weekly,目录下的脚本会每周执行一次,在每周第七天的6点47分时运行;

系统默认执行时间可以根据需求进行修改。

命令执行顺序

比如可能进行以下部分操作:

sudo apt-get update
sudo apt-get install some-tool
some-tool

这几个命令之间有等待。我们可以一次性输入完:

sudo apt-get update;sudo apt-get install some-tool;some-tool

然后就可以让它一次性运行了

但是前面的命令没成功怎么办?用which来查找是否安装了某个命令

which cowsay>/dev/null && cowsay -f head-in ohch~

没有安装cowsay,什么也不会发生,如果安装了cowsay则会发生。

&&表示前面的命令执行状态(不是输出结果)为0,则执行后面的

||表示前面的命令执行状态不为0,则执行后面的

管道

管道是一种通信机制,常用于进程间的通信(也可以用socket网络通信),它表现出的形式就是将前面的每一个进程的输出直接作为下一个进程的输入。

|

ls -al /etc | less

将ls命令的输出做下一个命令less的输入,然后可以一行一行的看。

cut

打印每一行的某一字段 。打印/etc/passwd文件以:为分隔符的第一个字段和第六个字段:

cut /etc/passwd -d ':' -f 1,6

打印每一行的前N个字符:

# 前五个(包含第五个)
$ cut /etc/passwd -c -5
# 前五个之后的(包含第五个)
$ cut /etc/passwd -c 5-
# 第五个
$ cut /etc/passwd -c 5
# 2到5之间的(包含第五个)
$ cut /etc/passwd -c 2-5

grep

在文本中或stdin(输入)中查找匹配字符串

一般形式:

grep [命令选项]... 用于匹配的表达式 [文件]...

可结合正则表达式表现强大的功力:

查看环境变量中以”yanlou”结尾的字符串

$ export | grep ".*yanlou$"

wc

用于输出文件中,行,单词,字节数。

输出/etc/passwd文件的统计信息:

wc /etc/passwd

sort

将输入按照一定方式排序,然后再输出,它支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序,指定特定字段进行排序等等。

uniq

uniq命令可以用于过滤或者输出重复行。

数据流重定向

经常用到的两个重定向操作:

> 输出到文件,如果存在,则清空,不存在则创建

>>追加到文件,如果存在,则追加,不存在则创建

< 的作用,就是将原本应该由键盘输入的数据经由文件读入。

linux默认提供了三个特殊设备,用于终端的显示和输出,分别为stdin(标准输入,对应于你在终端的输入),stdout(标准输出,对应于终端的输出),stderr(标准错误输出,对应于终端的输出)。

文件描述符 设备文件 说明
0 /dev/stdin 标准输入
1 /dev/stdout 标准输出
2 /dev/stderr 标准错误

文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于 UNIX、Linux 这样的操作系统。

日志系统

在 Linux 中大部分的发行版都内置使用 syslog 系统日志,那么通过前期的课程我们了解到常见的日志一般存放在 /var/log中:

$ ll /var/log